package thread;

/**
 * @author DBX
 * @effect 在静态方法上使用synchronized后，该方法变成同步方法，并且一定具有同步效果
 * @date 2021/09/01/16:28
 */
public class SyncDemo3 {
    public static void main(String[] args) {
        Thread t1 = new Thread(){
            @Override
            public void run() {
                Boo.doSome();
            }
        };
        Thread t2 = new Thread(){
            @Override
            public void run() {
                Boo.doSome();
            }
        };
        t1.start();
        t2.start();
    }
}
class Boo{
//    在静态方法上修饰，那么这个不跟对象有关系，无论如何，它都要同步执行，也就是排队
//    如果这里没有静态static，那么就跟对象有关系了，不是同一个对象的话，就是异步执行，也就是并发

    /*
		第一种：同步代码块
			灵活
			synchronized(线程共享对象){
				同步代码块;
			}

		第二种：在实例方法上使用synchronized
			表示共享对象一定是this
			并且同步代码块是整个方法体。

		第三种：在静态方法上使用synchronized
			表示找类锁。
			类锁永远只有1把。
			就算创建了100个对象，那类锁也只有一把。

		对象锁：1个对象1把锁，100个对象100把锁。
		类锁：100个对象，也可能只是1把类锁。*/
    public  static void doSome(){
//        静态方法中使用同步块通常指定的同步监视器对象还是类对象
//        获取一个类的对象可以使用：类名.class
        synchronized (Boo.class){
        Thread t = Thread.currentThread();
        System.out.println(t.getName()+" :正在执行doSome方法 ");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(t.getName()+" :结束执行doSome方法 ");
    }}
}
